}
}
- const BLOCK_SUCCESS = 0; // Success
- const BLOCK_RANGE_INVALID = 1; // Invalid IP range
- const BLOCK_RANGE_DISABLED = 2; // Sysops can't block ranges
- const BLOCK_NONEXISTENT_USER = 3; // No such user
- const BLOCK_IP_INVALID = 4; // Invalid IP address
- const BLOCK_EXPIRY_INVALID = 5; // Invalid expiry time
- const BLOCK_ALREADY_BLOCKED = 6; // User is already blocked
/**
* Backend block code.
* $userID and $expiry will be filled accordingly
- * Returns one of the BLOCK_* constants
+ * @return array(message key, arguments) on failure, empty array on success
*/
function doBlock(&$userId = null, &$expiry = null)
{
# IPv4
if ( $wgSysopRangeBans ) {
if ( !IP::isIPv4( $this->BlockAddress ) || $matches[2] < 16 || $matches[2] > 32 ) {
- return self::BLOCK_RANGE_INVALID;
+ return array('ip_range_invalid');
}
$this->BlockAddress = Block::normaliseRange( $this->BlockAddress );
} else {
# Range block illegal
- return self::BLOCK_RANGE_DISABLED;
+ return array('range_block_disabled');
}
} else if ( preg_match( "/^($rxIP6)\\/(\\d{1,3})$/", $this->BlockAddress, $matches ) ) {
# IPv6
if ( $wgSysopRangeBans ) {
if ( !IP::isIPv6( $this->BlockAddress ) || $matches[2] < 64 || $matches[2] > 128 ) {
- return self::BLOCK_RANGE_INVALID;
+ return array('ip_range_invalid');
}
$this->BlockAddress = Block::normaliseRange( $this->BlockAddress );
} else {
# Range block illegal
- return self::BLOCK_RANGE_DISABLED;
+ return array('range_block_disabled');
}
} else {
# Username block
$user = User::newFromName( $this->BlockAddress );
if( !is_null( $user ) && $user->getID() ) {
# Use canonical name
- $this->BlockAddress = $user->getName();
$userId = $user->getID();
} else {
- return self::BLOCK_NONEXISTENT_USER;
+ return array('nosuchusershort', htmlspecialchars($user->getName()));
}
} else {
- return self::BLOCK_IP_INVALID;
+ return array('badipaddress');
}
}
}
$expirestr = $this->BlockOther;
if (strlen($expirestr) == 0) {
- return self::BLOCK_EXPIRY_INVALID;
+ return array('ipb_expiry_invalid');
}
if ( $expirestr == 'infinite' || $expirestr == 'indefinite' ) {
$expiry = strtotime( $expirestr );
if ( $expiry < 0 || $expiry === false ) {
- return self::BLOCK_EXPIRY_INVALID;
+ return array('ipb_expiry_invalid');
}
$expiry = wfTimestamp( TS_MW, $expiry );
if (wfRunHooks('BlockIp', array(&$block, &$wgUser))) {
if ( !$block->insert() ) {
- return self::BLOCK_ALREADY_BLOCKED;
+ return array('ipb_already_blocked', htmlspecialchars($this->BlockAddress));
}
wfRunHooks('BlockIpComplete', array($block, $wgUser));
$reasonstr, $logParams );
# Report to the user
- return self::BLOCK_SUCCESS;
+ return array();
}
+ else
+ return array('hookaborted');
}
/**
{
global $wgOut;
$retval = $this->doBlock();
- switch($retval)
- {
- case self::BLOCK_RANGE_INVALID:
- $this->showForm( wfMsg( 'ip_range_invalid' ) );
- return;
- case self::BLOCK_RANGE_DISABLED:
- $this->showForm( wfMsg( 'range_block_disabled' ) );
- return;
- case self::BLOCK_NONEXISTENT_USER:
- $this->showForm( wfMsg( 'nosuchusershort', htmlspecialchars( $this->BlockAddress ) ) );
- return;
- case self::BLOCK_IP_INVALID:
- $this->showForm( wfMsg( 'badipaddress' ) );
- return;
- case self::BLOCK_EXPIRY_INVALID:
- $this->showForm( wfMsg( 'ipb_expiry_invalid' ) );
- return;
- case self::BLOCK_ALREADY_BLOCKED:
- $this->showForm( wfMsg( 'ipb_already_blocked', htmlspecialchars( $this->BlockAddress ) ) );
- return;
- case self::BLOCK_SUCCESS:
- $titleObj = SpecialPage::getTitleFor( 'Blockip' );
- $wgOut->redirect( $titleObj->getFullURL( 'action=success&ip=' .
- urlencode( $this->BlockAddress ) ) );
- return;
- default:
- throw new MWException( __METHOD__ . ": Unknown return value ``{$retval}''" );
+ if(empty($retval)) {
+ $titleObj = SpecialPage::getTitleFor( 'Blockip' );
+ $wgOut->redirect( $titleObj->getFullURL( 'action=success&ip=' .
+ urlencode( $this->BlockAddress ) ) );
+ return;
}
+ $key = array_shift($retval);
+ $this->showForm(wfMsgReal($key, $retval));
}
function showSuccess() {
function doSubmit() {
global $wgOut;
- $retval = self::doUnblock(&$this->id, &$this->ip, &$this->reason, &$range);
+ $retval = self::doUnblock($this->id, $this->ip, $this->reason, $range);
if($retval == self::UNBLOCK_SUCCESS) {
# Report to the user
$titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
'cantmove-titleprotected' => array('code' => 'protectedtitle', 'info' => "The destination article has been protected from creation"),
// 'badarticleerror' => shouldn't happen
// 'badtitletext' => shouldn't happen
+ 'ip_range_invalid' => array('code' => 'invalidrange', 'info' => "Invalid IP range"),
+ 'range_block_disabled' => array('code' => 'rangedisabled', 'info' => "Blocking IP ranges has been disabled"),
+ 'nosuchusershort' => array('code' => 'nosuchuser', 'info' => "The user you specified doesn't exist"),
+ 'badipaddress' => array('code' => 'invalidip', 'info' => "Invalid IP address specified"),
+ 'ipb_expiry_invalid' => array('code' => 'invalidexpiry', 'info' => "Invalid expiry time"),
+ 'ipb_already_blocked' => array('code' => 'alreadyblocked', 'info' => "The user you tried to block was already blocked"),
// API-specific messages
'missingparam' => array('code' => 'no$1', 'info' => "The \$1 parameter must be set"),
'pastexpiry' => array('code' => 'pastexpiry', 'info' => "Expiry time is in the past"),
'create-titleexists' => array('code' => 'create-titleexists', 'info' => "Existing titles can't be protected with 'create'"),
'missingtitle-createonly' => array('code' => 'missingtitle-createonly', 'info' => "Missing titles can only be protected with 'create'"),
+ 'cantblock' => array('code' => 'cantblock', 'info' => "You don't have permission to block users"),
+ 'canthide' => array('code' => 'canthide', 'info' => "You don't have permission to hide user names from the block log"),
+ 'cantblock-email' => array('code' => 'cantblock-email', 'info' => "You don't have permission to block users from sending e-mail through the wiki"),
);
/**
}
if(is_null($params['user']))
- $this->dieUsage('The user parameter must be set', 'nouser');
+ $this->dieUsageMsg(array('missingparam', 'user'));
if(is_null($params['token']))
- $this->dieUsage('The token parameter must be set', 'notoken');
+ $this->dieUsageMsg(array('missingparam', 'token'));
if(!$wgUser->matchEditToken($params['token']))
- $this->dieUsage('Invalid token', 'badtoken');
+ $this->dieUsageMsg(array('sessionfailure'));
if(!$wgUser->isAllowed('block'))
- $this->dieUsage('You don\'t have permission to block users', 'permissiondenied');
+ $this->dieUsageMsg(array('cantblock'));
if($params['hidename'] && !$wgUser->isAllowed('hideuser'))
- $this->dieUsage('You don\'t have permission to hide user names from the block log', 'nohide');
+ $this->dieUsageMsg(array('canthide'));
+ if($params['noemail'] && !$wgUser->isAllowed('blockemail'))
+ $this->dieUsageMsg(array('cantblock-email'));
if(wfReadOnly())
- $this->dieUsage('The wiki is in read-only mode', 'readonly');
+ $this->dieUsageMsg(array('readonlytext'));
$form = new IPBlockForm('');
$form->BlockAddress = $params['user'];
- $form->BlockReason = $params['reason'];
+ $form->BlockReason = (is_null($params['reason']) ? '' : $params['reason']);
$form->BlockReasonList = 'other';
$form->BlockExpiry = ($params['expiry'] == 'never' ? 'infinite' : $params['expiry']);
$form->BlockOther = '';
$dbw = wfGetDb(DB_MASTER);
$dbw->begin();
$retval = $form->doBlock($userID, $expiry);
- switch($retval)
- {
- case IPBlockForm::BLOCK_SUCCESS:
- break; // We'll deal with that later
- case IPBlockForm::BLOCK_RANGE_INVALID:
- $this->dieUsage("Invalid IP range ``{$params['user']}''", 'invalidrange');
- case IPBlockForm::BLOCK_RANGE_DISABLED:
- $this->dieUsage('Blocking IP ranges has been disabled', 'rangedisabled');
- case IPBlockForm::BLOCK_NONEXISTENT_USER:
- $this->dieUsage("User ``{$params['user']}'' doesn't exist", 'nosuchuser');
- case IPBlockForm::BLOCK_IP_INVALID:
- $this->dieUsage("Invaild IP address ``{$params['user']}''", 'invalidip');
- case IPBlockForm::BLOCK_EXPIRY_INVALID:
- $this->dieUsage("Invalid expiry time ``{$params['expiry']}''", 'invalidexpiry');
- case IPBlockForm::BLOCK_ALREADY_BLOCKED:
- $this->dieUsage("User ``{$params['user']}'' is already blocked", 'alreadyblocked');
- default:
- $this->dieDebug(__METHOD__, "IPBlockForm::doBlock() returned an unknown error ($retval)");
- }
+ if(!empty($retval))
+ // We don't care about multiple errors, just report one of them
+ $this->dieUsageMsg($retval);
+
$dbw->commit();
-
$res['user'] = $params['user'];
$res['userID'] = $userID;
$res['expiry'] = ($expiry == Block::infinity() ? 'infinite' : $expiry);
'anononly' => 'Block anonymous users only (i.e. disable anonymous edits for this IP)',
'nocreate' => 'Prevent account creation',
'autoblock' => 'Automatically block the last used IP address, and any subsequent IP addresses they try to login from',
- 'noemail' => 'Prevent user from sending e-mail through the wiki',
+ 'noemail' => 'Prevent user from sending e-mail through the wiki. (Requires the "blockemail" right.)',
'hidename' => 'Hide the username from the block log. (Requires the "hideuser" right.)'
);
}